"""
订单服务模块
提供订单创建、更新、查询等核心业务功能
"""
from sqlmodel import Session, select
from typing import List, Optional, Dict, Any
from datetime import datetime
import uuid
import logging
from app.models.order_models import Order, OrderItem, OrderStatus, PaymentStatus

logger = logging.getLogger(__name__)


class OrderService:
    """
    订单服务类
    处理订单相关的业务逻辑，包括创建、更新、查询订单等功能
    """
    
    def __init__(self, db: Session):
        """
        初始化订单服务
        
        Args:
            db (Session): 数据库会话对象
        """
        self.db = db
    
    def create_order(self, order_data: Dict[str, Any]) -> Order:
        """
        创建订单
        根据订单数据创建新订单及相关订单项
        
        Args:
            order_data (Dict[str, Any]): 订单数据，包含用户ID、总金额、模型参数等信息
            
        Returns:
            Order: 创建的订单对象
            
        Raises:
            Exception: 当创建订单失败时抛出
        """
        try:
            # 生成唯一的订单编号
            order_number = self._generate_order_number()
            
            # 创建订单主记录
            order = Order(
                order_number=order_number,
                user_id=order_data["user_id"],  # 用户ID为必填
                total_amount=order_data.get("total_amount", 0),  # 订单总金额
                model_id=order_data.get("model_id"),  # 3D模型ID（可选）
                model_parameters=order_data.get("model_parameters", {}),  # 模型参数（可选）
                status=OrderStatus.PENDING,  # 初始状态为待处理
                payment_status=PaymentStatus.PENDING  # 初始支付状态为待支付
            )
            
            # 保存订单主记录
            self.db.add(order)
            self.db.commit()
            self.db.refresh(order)  # 刷新以获取自动生成的ID
            
            # 处理订单项列表
            for item_data in order_data.get("items", []):
                order_item = OrderItem(
                    order_id=order.id,  # 关联到刚创建的订单
                    product_id=item_data["product_id"],  # 产品ID为必填
                    quantity=item_data.get("quantity", 1),  # 数量，默认为1
                    unit_price=item_data.get("unit_price", 0),  # 单价
                    total_price=item_data.get("total_price", 0),  # 总价
                    material=item_data.get("material", "PLA"),  # 材料，默认为PLA
                    color=item_data.get("color", "white"),  # 颜色，默认为白色
                    size=item_data.get("size", "medium")  # 尺寸，默认为中等
                )
                self.db.add(order_item)
            
            # 提交所有更改
            self.db.commit()
            logger.info(f"订单创建成功: {order.order_number}")
            return order
            
        except Exception as e:
            # 发生异常时回滚事务
            self.db.rollback()
            logger.error(f"创建订单失败: {str(e)}")
            raise
    
    def update_order_status(self, order_id: int, status: OrderStatus) -> Order:
        """
        更新订单状态
        
        Args:
            order_id (int): 订单ID
            status (OrderStatus): 新的订单状态
            
        Returns:
            Order: 更新后的订单对象
            
        Raises:
            ValueError: 当订单不存在时抛出
        """
        # 根据ID查询订单
        order = self.db.get(Order, order_id)
        if not order:
            raise ValueError("订单不存在")
        
        # 更新状态和更新时间
        order.status = status
        order.updated_at = datetime.utcnow()
        
        # 提交更改
        self.db.commit()
        self.db.refresh(order)
        
        logger.info(f"订单状态更新: {order.order_number} -> {status}")
        return order
    
    def get_order_by_number(self, order_number: str) -> Optional[Order]:
        """
        根据订单编号查询订单
        
        Args:
            order_number (str): 订单编号
            
        Returns:
            Optional[Order]: 查询到的订单对象，如不存在则返回None
        """
        statement = select(Order).where(Order.order_number == order_number)
        return self.db.exec(statement).first()
    
    def get_user_orders(self, user_id: int) -> List[Order]:
        """
        查询用户的所有订单
        
        Args:
            user_id (int): 用户ID
            
        Returns:
            List[Order]: 用户订单列表，按创建时间倒序排列
        """
        statement = select(Order).where(Order.user_id == user_id).order_by(Order.created_at.desc())
        return self.db.exec(statement).all()
    
    def _generate_order_number(self) -> str:
        """
        生成订单编号
        格式：3D + 年月日时分秒 + 6位随机数
        
        Returns:
            str: 生成的订单编号
        """
        timestamp = datetime.utcnow().strftime("%Y%m%d%H%M%S")  # 获取时间戳
        random_str = str(uuid.uuid4().int)[:6]  # 生成6位随机数
        return f"3D{timestamp}{random_str}"  # 组合订单编号